import numpy as np  # 导入numpy库，并用np作为别名，方便后续调用  

def fit(X, y):  # 定义一个名为fit的函数，接收两个参数：X（特征数据）和y（目标数据）  
    print("训练模型")  # 打印提示信息，表示正在训练模型  
    X = np.array(X)  # 将输入的X转换为numpy数组  
    y = np.array(y).reshape(-1,1)  # 将输入的y转换为numpy数组，并重新调整其形状为（根据列数确定行数（-1含义））
  
    # 下一行代码的注释已经写好，直接给出  
    # It is better to write a comment for the code in the next line  
    X = np.column_stack(tup=(np.ones(shape=(X.shape[0], 1)), X))  # 在X的左侧添加一列全为1的数据，这通常用于代表偏置项  
  
    w = np.random.randint(-10, 10, 14).reshape(-1, 1)  # 生成一个形状为(14,1)的随机整数数组w，范围在-10到10之间  
    iter = 30000  # 设置迭代次数为30000  
    learning_rate = 0.001  # 设置学习率为0.001  
  
    for i in range(iter):  # 开始迭代，共迭代iter次  
        gradient = np.zeros(shape=(X.shape[1],1))  # 初始化一个与w形状相同的全零数组gradient，用于存储梯度  
  
        # 下一行注释已经给出，描述该行的作用  
        # 求出损失函数对每个未知系数求偏导。求得的14个偏导组成了gradient，形成梯度  
        for j in range(X.shape[1]):  # 遍历X的每一列（即每一个特征）  
            gradient[j,0] = 2 / X.shape[0] * ((X @ w) - y).T @ X[:,j]  # 计算损失函数对w[j]的偏导，并存储在gradient[j,0]中  
  
        w = w - gradient * learning_rate  # 使用梯度下降法更新w的值  
  
    return w  # 返回训练得到的w值